# 过滤时间规则
import talib
from PyQt5 import QtCore
# CTP行情库
from vnctpmd import *
import numpy as np
import globalvar
import numba as nb


class MyFilter():
    def __init__(self, period):
        self.period = period

    # 由于实盘是Tick驱动，所以实盘直接调用OnFilterByTick，分2种情况：
    # （1）OnFilter(self, mddata, type)方法，参数type=True 时，调用OnFilterByBar获得返回值True或False，适合非TICK级回测
    # （2）OnFilter(self, mddata, type)方法，参数type=False 时，基于Tick级过滤规则，适合基于Tick回调的实盘
    # 返回值：True(设“且”时，不过滤交易信号)，False(设“且”时，过滤交易信号)
    # 调用OnFilter的有2处：
    # （1）回测模块 module_backtest.py 文件中 ，由 CalFilter(self, flist, kline, id)方法实现触发OnFilter(self,mddata,True)
    # （2）策略管理模块module_strategy.py文件中，由CalFilter(self, flist, kline, id)方法实现触发OnFilter(self,mddata,False)
    def OnFilter(self, mddata, type):
        # type参数对时间过滤规则无意义，直接返回OnFilterByTick(self, mddata)的返回值
        # if type:
        # 非Tick级(一般是M1周期及以上K线量化回测)
        # OnFilter(self, mddata, type)的参数mddata数据结构和OnFilterByBar(self, mddata)的mddata参数类型一致
        # 量化回测module_backtest.py的CalFilter，可直接触发OnFilterByBar
        #    return self.OnFilterByBar(mddata)
        # else:
        # Tick级，分2种情况（1）直接撰写TICK级规则代码 （2）为减少计算，每K线周期只计算一次OnFilterByBar(self, mddata)
        return self.OnFilterByTick(globalvar.md.GetKline(mddata.InstrumentID, 0))

    def OnFilterByTick(self, tickdata):
        # 时间过滤为Tick级，选（1）直接撰写TICK级规则代码
        klinetime = float(tickdata.klinetime.decode())
        if klinetime > 0.1450 and klinetime < 0.15:
            # 返回True表示过滤交易信号
            return True
        elif klinetime > 0.2100 and klinetime < 0.2130:
            # 返回True表示过滤交易信号
            return True
        else:
            # 返回True表示过滤交易信号
            return False

    # 量化回测默认是基于M1及以上级别
    # 对于回测数据是M1以上级别数据，即非Tick级规则，直接调用OnFilterByBar方法即可
    # def OnFilterByBar(self, mddata):
    #        return True
